

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/favicon.png">
  <link rel="icon" type="image/png" href="/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="">
  <meta name="author" content="caoyusang">
  <meta name="keywords" content="">
  <title>MySQL索引详解 - caoyusang的科研日常</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
    
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.2.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>caoyusang</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" href="javascript:">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner intro-2" id="background" parallax=true
         style="background: url('/img/7.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container page-header text-center fade-in-up">
            <span class="h2" id="subtitle">
              
            </span>

            
              <div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2021-04-06 20:33" pubdate>
        2021年4月6日 晚上
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      2.5k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      33
       分钟
    </span>
  

  
  
    
      <!-- 不蒜子统计文章PV -->
      <span id="busuanzi_container_page_pv" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="busuanzi_value_page_pv"></span> 次
      </span>
    
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto" id="post">
            <!-- SEO header -->
            <h1 style="display: none">MySQL索引详解</h1>
            
              <p class="note note-info">
                
                  本文最后更新于：25 天前
                
              </p>
            
            <div class="markdown-body" id="post-body">
              <h1 id="MySQL索引"><a href="#MySQL索引" class="headerlink" title="MySQL索引"></a>MySQL索引</h1><h2 id="什么是索引？"><a href="#什么是索引？" class="headerlink" title="什么是索引？"></a>什么是索引？</h2><h3 id="官方定义"><a href="#官方定义" class="headerlink" title="官方定义"></a>官方定义</h3><p>一种帮助MySQL提高查询效率的数据结构。</p>
<h3 id="索引的优点"><a href="#索引的优点" class="headerlink" title="索引的优点"></a>索引的优点</h3><p>大大加快数据的查询速度</p>
<h3 id="索引的缺点"><a href="#索引的缺点" class="headerlink" title="索引的缺点"></a>索引的缺点</h3><p>创建索引是为产生索引文件的，<code>占用磁盘空间</code>。索引文件是一个二叉树类型的文件，可想而知我们的DML操作，对表记录的<code>增、删、改</code>操作同样也会对索引文件进行修改，所以<code>性能会相应的有所下降</code>。</p>
<h2 id="索引的分类-INNODB"><a href="#索引的分类-INNODB" class="headerlink" title="索引的分类(INNODB)"></a>索引的分类(INNODB)</h2><img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/image-20210406104516865.png" srcset="/img/loading.gif" class="">
<h3 id="主键索引"><a href="#主键索引" class="headerlink" title="主键索引"></a>主键索引</h3><p>将表属性设定为<code>主键</code>后，数据库会自动为主键创建<code>聚簇索引</code>。</p>
<h3 id="单值索引"><a href="#单值索引" class="headerlink" title="单值索引"></a>单值索引</h3><p>一个索引<code>只包含单个列</code>，一个表中可以有多个单值索引，这种索引又称单列索引或者<code>普通索引</code>。</p>
<h3 id="唯一索引"><a href="#唯一索引" class="headerlink" title="唯一索引"></a>唯一索引</h3><p>索引列的值必须唯一，但<code>允许有空值null(和主键不同，主键不允许为空)</code>，但只能有一个（因为唯一）。</p>
<h3 id="复合索引"><a href="#复合索引" class="headerlink" title="复合索引"></a>复合索引</h3><p>一个索引包含多个列。</p>
<p>ps：MySQL5.7之前，MyISAM引擎可以提供<code>全文索引</code>，即在定义索引的列上支持值得全文查找，允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR、TEXT类型列上创建。全文索引只有MyISAM存储引擎支持。</p>
<h2 id="索引的基本操作"><a href="#索引的基本操作" class="headerlink" title="索引的基本操作"></a>索引的基本操作</h2><p>创建一个用于测试索引的数据库<code>test_index</code></p>
<h3 id="主键索引——自动创建"><a href="#主键索引——自动创建" class="headerlink" title="主键索引——自动创建"></a>主键索引——自动创建</h3><pre><code class="hljs sql"><span class="hljs-comment">-- 切换数据库</span>
<span class="hljs-keyword">use</span> test_index;
<span class="hljs-comment">-- 创建表t_user</span>
<span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_user(<span class="hljs-keyword">id</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">20</span>) primary <span class="hljs-keyword">key</span> , <span class="hljs-keyword">name</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">10</span>));
<span class="hljs-comment">-- 展示表索引</span>
<span class="hljs-keyword">show</span> <span class="hljs-keyword">index</span> <span class="hljs-keyword">from</span> t_user;</code></pre>
<p><code>表索引展示</code></p>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/image-20210406092618871.png" srcset="/img/loading.gif" class="">
<h3 id="单值索引——手动创建"><a href="#单值索引——手动创建" class="headerlink" title="单值索引——手动创建"></a>单值索引——手动创建</h3><h4 id="建表时创建"><a href="#建表时创建" class="headerlink" title="建表时创建"></a>建表时创建</h4><pre><code class="hljs sql"><span class="hljs-comment">-- 创建表t_user时同时创建索引</span>
<span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_user_common(<span class="hljs-keyword">id</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">20</span>) primary <span class="hljs-keyword">key</span> , <span class="hljs-keyword">name</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">10</span>), <span class="hljs-keyword">key</span>(<span class="hljs-keyword">name</span>));</code></pre>
<p><code>索引展示</code></p>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/image-20210406093634715.png" srcset="/img/loading.gif" class="">
<h4 id="建表后创建"><a href="#建表后创建" class="headerlink" title="建表后创建"></a>建表后创建</h4><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">index</span> name_index <span class="hljs-keyword">on</span> t_user(<span class="hljs-keyword">name</span>);</code></pre>
<h3 id="唯一索引——手动创建"><a href="#唯一索引——手动创建" class="headerlink" title="唯一索引——手动创建"></a>唯一索引——手动创建</h3><h4 id="建表时创建-1"><a href="#建表时创建-1" class="headerlink" title="建表时创建"></a>建表时创建</h4><pre><code class="hljs sql"><span class="hljs-comment">-- 创建表t_user时使用unique创建唯一索引</span>
<span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_user(<span class="hljs-keyword">id</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">20</span>) primary <span class="hljs-keyword">key</span> , <span class="hljs-keyword">name</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">10</span>), <span class="hljs-keyword">unique</span>(<span class="hljs-keyword">name</span>));</code></pre>
<h4 id="建表后创建-1"><a href="#建表后创建-1" class="headerlink" title="建表后创建"></a>建表后创建</h4><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">unique</span> <span class="hljs-keyword">index</span> name_index <span class="hljs-keyword">on</span> t_user(<span class="hljs-keyword">name</span>);</code></pre>
<h3 id="复合索引——手动创建"><a href="#复合索引——手动创建" class="headerlink" title="复合索引——手动创建"></a>复合索引——手动创建</h3><h4 id="建表时创建-2"><a href="#建表时创建-2" class="headerlink" title="建表时创建"></a>建表时创建</h4><pre><code class="hljs sql"><span class="hljs-comment">-- 创建表t_user时使用key()创建复合索引</span>
<span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_user(<span class="hljs-keyword">id</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">20</span>) primary <span class="hljs-keyword">key</span> , <span class="hljs-keyword">name</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">10</span>), age <span class="hljs-built_in">int</span>(<span class="hljs-number">3</span>), <span class="hljs-keyword">key</span>(<span class="hljs-keyword">name</span>, age));</code></pre>
<h4 id="建表后创建-2"><a href="#建表后创建-2" class="headerlink" title="建表后创建"></a>建表后创建</h4><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">index</span> name_age_index <span class="hljs-keyword">on</span> t_user(<span class="hljs-keyword">name</span>, age);</code></pre>
<p>查询时原则上需要遵从<code>最左匹配原则</code>，才能利用复合索引，另外MySQL的引擎为了更好地利用复合索引，再查询过程中会动态调整查询字段的顺序以便利用索引。</p>
<pre><code class="hljs markdown">name age √
age name √
age ×
name √</code></pre>
<h2 id="索引的底层原理"><a href="#索引的底层原理" class="headerlink" title="索引的底层原理"></a>索引的底层原理</h2><h3 id="BTree"><a href="#BTree" class="headerlink" title="BTree"></a>BTree</h3><p>B树是一种多叉平衡查找树，其主要特点：</p>
<p>（1）B树的节点中<code>存储着多个元素</code>，每个内节点有多个分叉。</p>
<p>（2）节点中的元素包含键值和数据，节点中的<code>键值从小到大排列</code>。也就是说，在<code>所有的节点都储存数据</code>。</p>
<p>（3）父节点当中的元素不会出现在子节点中。</p>
<p>（4）所有的<code>叶子结点都位于同一层</code>，叶节点具有相同的深度，<code>叶节点之间没有指针连接</code>。</p>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/BTree.png" srcset="/img/loading.gif" class="">
<h3 id="B-Tree"><a href="#B-Tree" class="headerlink" title="B+Tree"></a>B+Tree</h3><p>B+树是B树的升级版，它们最主要的区别在于非叶子节点是否存储数据的问题。</p>
<p>B+树在结构上和B树的<code>区别</code>在于：</p>
<ul>
<li><code>只有叶子节点才会存储数据</code>，非叶子节点至存储键值</li>
<li>叶子节点之间使用双向指针连接，最底层的叶子节点形成了一个<code>双向有序链表</code>。</li>
</ul>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/B+Tree.png" srcset="/img/loading.gif" class="">
<p><code>INNODB中的B+Tree的特点</code>:</p>
<p>（1）它是BTree 的变种，BTree能解决的问题，它都能解决。</p>
<p>（2）扫库、扫表能力更强(进行全表扫描时，只需要遍历叶子节点就可以了)</p>
<p>（3）B+Tree的磁盘读写能力相对于BTree来说更强(根节点和分支节点不保存数据区， 所以一个节点可以保存更多的关键字，一次磁盘加载的关键字更多)</p>
<p>（4）排序能力更强(因为叶子节点上有下一个数据区的指针，数据形成了链表)</p>
<p>（5）效率更加稳定(B+Tree 永远是在叶子节点拿到数据，所以 IO 次数是稳定的)</p>
<h3 id="建立索引过程"><a href="#建立索引过程" class="headerlink" title="建立索引过程"></a>建立索引过程</h3><ul>
<li>往数据表中插入数据时，数据库引擎会对插入的元素进行<code>排序</code>，以链表的形式把节点(索引，数据，指针)串起来。</li>
<li><code>分页处理</code>，INNODB引擎默认分页大小为<code>16KB</code>，在最底层的页中存放所有的数据，在其他层则存放的是分页索引和链接指针。</li>
<li>索引有两种实现的数据结构，<code>B树和B+树</code><ul>
<li>B+树的非叶节点只存储键值信息</li>
<li>B+树所有叶子节点之间都有一个链接指针</li>
<li>B+树把所有数据记录方法叶子节点中</li>
</ul>
</li>
<li>数据库中，B+树的高度一般都在2~4层。由于MySQL的INNODB引擎在设计时是将B+树的<code>根节点常驻内存</code>的，因此在查找某一键值的行记录时，<code>最多只需要1~3次磁盘IO</code>。</li>
</ul>
<h2 id="聚簇索引和非聚簇索引"><a href="#聚簇索引和非聚簇索引" class="headerlink" title="聚簇索引和非聚簇索引"></a>聚簇索引和非聚簇索引</h2><p>MySQL中最常见的两种存储引擎分别是<code>MyISAM和INNODB</code>，分别实现了非聚簇索引和聚簇索引。</p>
<p>在索引的分类中，我们可以按照索引的键是否为主键来分为“主键索引”和“辅助索引”，使用主键键值建立的索引称为“主键索引”，其它的称为“辅助索引”。因此<code>主键索引只能有一个，辅助索引可以有很多个</code>。</p>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/image-20210406140901401.png" srcset="/img/loading.gif" class="">
<h3 id="INNODB-——-聚簇索引"><a href="#INNODB-——-聚簇索引" class="headerlink" title="INNODB —— 聚簇索引"></a>INNODB —— 聚簇索引</h3><p>聚簇索引——索引和数据放在一起，找到了索引就找到了数据。</p>
<h4 id="聚簇索引的使用过程"><a href="#聚簇索引的使用过程" class="headerlink" title="聚簇索引的使用过程"></a>聚簇索引的使用过程</h4><p>INNODB使用的是聚簇索引，将主键组织到一棵B+树中 ，而行数据就存储在叶子节点上，通过”where id = 14”这样的条件查找主键时，则按照B+树的检索算法即可找到对应的叶子节点，并获取其行数据。</p>
<p>特别地，若对其中的任意一列例如Name列进行条件搜索，则需要进行两个步骤：</p>
<ul>
<li>第一步，在辅助索引B+树中检索Name，到达叶子节点后获取其主键</li>
<li>第二步，根据第一步获取到的主键在主索引B+树中再执行一次B+树检索操作，最终到达对应的叶子节点即可获取整行数据</li>
</ul>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/innodb-index.png" srcset="/img/loading.gif" class="">
<p><code>聚簇索引默认为主键</code>，特别地，若表中没有定义主键，则INNODB会<code>选择一个唯一且非空的索引代替</code>，若没有这样的索引，则会<code>隐式地定义一个主键</code>（类似oracle中的RowId）来作为聚簇索引。</p>
<h4 id="聚簇索引的优势"><a href="#聚簇索引的优势" class="headerlink" title="聚簇索引的优势"></a>聚簇索引的优势</h4><ul>
<li>由于行数据和叶子节点存储在一起，同一页中会有多条行数据，访问同一数据页不同行记录时，已经把页加载到了Buffer中，再次访问的时候，会在内存中完成访问，不必访问磁盘。这样<code>主键和行数据是一起被载入内存</code>的，找到叶子节点就可以立刻将行数据返回了，如果按照主键Id来组织数据，获得数据更快。</li>
<li>辅助索引使用主键作为”指针”而不是使用地址值作为指针，这样做的好处是，<code>减少了当出现行移动或者数据页分裂时辅助索引的维护工作</code>，使用主键值当作指针会让辅助索引占用更多的空间，换来的好处是InnoDB在移动行时无须更新辅助索引中的这个”指针”。也就是说行的位置（实现中通过16K的Page来定位）会随着数据库里数据的修改而发生变化（前面的B+树节点分裂以及Page的分裂），使用聚簇索引就可以保证不管这个主键B+树的节点如何变化，辅助索引树都不受影响。</li>
<li>聚簇索引<code>适合用在排序</code>的场合，非聚簇索引不适合</li>
<li>取出一定<code>范围数据</code>的时候，使用聚簇索引</li>
<li>二级索引需要两次索引查找，而不是一次才能取到数据，因为存储引擎第一次需要通过二级索引找到索引的叶子节点，从而找到数据的主键，然后在聚簇索引中用主键再次查找索引，再找到数据</li>
<li>可以把<code>相关数据保存在一起</code>。例如实现电子邮箱时，可以根据用户 ID 来聚集数据，这样只需要从磁盘读取少数的数据页就能获取某个用户的全部邮件。如果没有使用聚簇索引，则每封邮件都可能导致一次磁盘 I/O。</li>
</ul>
<h4 id="聚簇索引的劣势"><a href="#聚簇索引的劣势" class="headerlink" title="聚簇索引的劣势"></a>聚簇索引的劣势</h4><ul>
<li><code>维护索引代价高</code>，特别是插入新行或者主键被更新导至要分页的时候</li>
<li>表因为使用UUId（随机ID）作为主键，使<code>数据存储稀疏</code>，这就会出现聚簇索引有可能有比全表扫描更慢</li>
<li>如果主键比较大的话，那辅助索引将会变的更大，因为辅助索引的叶子存储的是主键值；<code>过长的主键值，会导致非叶子节点占用占用更多的物理空间</code></li>
</ul>
<h3 id="MyISAM——非聚簇索引"><a href="#MyISAM——非聚簇索引" class="headerlink" title="MyISAM——非聚簇索引"></a>MyISAM——非聚簇索引</h3><p>非聚簇索引的数据表和索引表是分开存储的。</p>
<p>非聚簇索引中的数据是根据数据的插入顺序保存。因此非聚簇索引更适合单个数据的查询。插入顺序不受键值影响。</p>
<img src="/2021/04/06/MySQL%E7%B4%A2%E5%BC%95%E8%AF%A6%E8%A7%A3/myisam-index.png" srcset="/img/loading.gif" class="">
<h2 id="参考资料及部分图源"><a href="#参考资料及部分图源" class="headerlink" title="参考资料及部分图源"></a>参考资料及部分图源</h2><p><a target="_blank" rel="noopener" href="https://juejin.cn/post/6936032090546765837">全面分析由浅入深解析Mysql索引底层原理</a></p>
<p><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/fa8192853184">聚簇索引与非聚簇索引（也叫二级索引）</a></p>
<p><a target="_blank" rel="noopener" href="https://www.bilibili.com/video/BV19y4y127h4">这一次彻底搞定MySQL索引、从此不再恐惧面试</a></p>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/">数据库</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/MySQL/">MySQL</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" rel="nofollow noopener noopener">CC BY-SA 4.0 协议</a> ，转载请注明出处！</p>
              
              
                <div class="post-prevnext row">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2021/05/03/JUC%E5%B9%B6%E5%8F%91%E9%94%81/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">JUC并发锁</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2021/04/06/ThreadLocal%E8%AF%A6%E8%A7%A3/">
                        <span class="hidden-mobile">ThreadLocal详解</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  

  

  
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/js/debouncer.js" ></script>
<script  src="/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/lazyload.js" ></script>
  



  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/js/clipboard-use.js" ></script>



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>





  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: '#post-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    var typed = new Typed('#subtitle', {
      strings: [
        '  ',
        "MySQL索引详解&nbsp;",
      ],
      cursorChar: "_",
      typeSpeed: 70,
      loop: false,
    });
    typed.stop();
    $(document).ready(function () {
      $(".typed-cursor").addClass("h2");
      typed.start();
    });
  </script>



  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "hover",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/js/local-search.js" ></script>
  <script>
    var path = "/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.staticfile.org/mathjax/3.0.5/es5/tex-svg.js" ></script>

  











</body>
</html>
